package com.sakura.util.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by apple on 2018/6/22.
 *
 *
 * 核心线程：

 线程池新建线程的时候，如果当前线程总数小于corePoolSize，则新建的是核心线程，如果超过corePoolSize，则新建的是非核心线程

 核心线程默认情况下会一直存活在线程池中，即使这个核心线程啥也不干(闲置状态)。

 如果指定ThreadPoolExecutor的allowCoreThreadTimeOut这个属性为true，那么核心线程如果不干活(闲置状态)的话，超过一定时间(时长下面参数决定)，就会被销毁掉

 很好理解吧，正常情况下你不干活我也养你，因为我总有用到你的时候，但有时候特殊情况(比如我自己都养不起了)，那你不干活我就要把你干掉了

 作者：LiuZh_
 链接：https://www.jianshu.com/p/210eab345423
 來源：简书
 简书著作权归作者所有，任何形式的转载都请联系作者获得授权并注明出处。


 newSingleThreadExecutor    LinkedBlockingQueue
 newCachedThreadPool     SynchronousQueue
 newFixedThreadPool    LinkedBlockingQueue
 newScheduledThreadPool   DelayedWorkQueue

 */
public class ThreadPoolTest {

    public static void main(String[] args) {
        // 创建一个可重用固定线程数的线程池
//        ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
//
//        exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间就触发异常
//
//            @Override
//
//            public void run() {
//
//                //throw new RuntimeException();
//
//                System.out.println("================");
//
//            }
//
//        }, 1000, 5000, TimeUnit.MILLISECONDS);
//
//        exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间打印系统时间，证明两者是互不影响的
//
//            @Override
//
//            public void run() {
//
//                System.out.println(System.nanoTime());
//
//            }
//
//        }, 1000, 1000, TimeUnit.MILLISECONDS);

        ExecutorService pool = Executors.newSingleThreadExecutor();
        //ExecutorService pool = Executors.newCachedThreadPool();
        //ExecutorService pool = Executors.newFixedThreadPool(2);
        // 创建线程
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        Thread t3 = new MyThread();
        Thread t4 = new MyThread();
        Thread t5 = new MyThread();
        // 将线程放入池中进行执行
        pool.execute(t1);
        pool.execute(t2);
        pool.execute(t3);
        pool.execute(t4);
        pool.execute(t5);
        // 关闭线程池
        pool.shutdown();
    }
}

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "正在执行。。。");
    }
}
